package com.x.filters;

import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import javax.xml.crypto.Data;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * ClassName: LoggingFilter
 * Package: IntelliJ IDEA
 * Description:

 日志过滤器，记录请求历史，可打印于控制台或文件

 1、实现Filter接口
 2、重写过滤方法
 3、配置过滤器（映射路径等参数）

 * Written by HanXu
 * Create 2024.08.30 13:14
 */


public class LoggingFilter implements Filter {

    private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    /**
     * 过滤请求和响应的方法
     * 1、请求到达资源之前，先经过该方法
     * 2、该方法控制是否能继续向后响应
     * 3、请求到达目标资源后，在响应之前，会再次经过该方法
     */
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //参数父转子
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;

        //1、请求到达目标资源之前，打印时间日志
        System.out.println("请求到达目标资源之前");
        long t1 = System.currentTimeMillis();

        String requestURI = request.getRequestURI();
        String dateTime = dateFormat.format(new Date());
        String beforeLogging = requestURI+"在"+dateTime+"被访问了";
        System.out.println(beforeLogging);


        System.out.println("*******************************************");

        //2、放行代码,继续下一个过滤器
        filterChain.doFilter(servletRequest, servletResponse);

        System.out.println("*******************************************");


        //3、到达目标资源之后，响应之前
        System.out.println("请求到达目标资源之后，响应之前");
        long t2 = System.currentTimeMillis();
        String afterLogging = requestURI+"耗时"+(t2-t1)+"毫秒";
        System.out.println(afterLogging);
        System.out.println("*******************************************");

    }
}
